﻿// ======================================================================================
///	\file BLUESOLEIL Implementation
// ======================================================================================
#ifndef _BLUESOLEIL_INTERFACE_
#define _BLUESOLEIL_INTERFACE_

#include "../bluetoothstack.h"
#include "Btsdk_Macro.h"
#include "Btsdk_Stru.h"


#define DLL_NAME	_T("Bssdk.dll")

// ====== Declare Bluesoleil Functions
typedef BTINT32 (* BTSDKVOID)(void);
typedef BTINT32 (* BTDISCOVER)(BTUINT32, BTUINT16, BTUINT16);
typedef BTINT32 (* BTREGISTER)(PBtSdkCallbackStru);
typedef BTINT32 (* BTADDRESS)(BTDEVHDL, BTUINT8*);
typedef BTINT32 (* BTNAME)(BTDEVHDL, BTUINT8*, BTUINT16);
typedef BTINT32 (* BTPAIR)(BTDEVHDL);
typedef BTINT32 (* BTISPAIRED)(BTDEVHDL, BTBOOL*);
typedef BTCONNHDL(* BTENUMCONN)(BTSDKHANDLE, PBtSdkConnectionPropertyStru);
typedef BTINT16 (* BTGETPORT) (BTCONNHDL);

/// \brief Implmentează standardul impus de clasa abstracă BluetoothStack prin Bluesoleil
class BluesoleilInterface :
	public BluetoothStack
{
protected:
// ======================================================================================
//	Internal data
// ======================================================================================
	/// \brief Librăria Bluesoleil pe care se bazează implementarea curentă.
	/// \version 1.0
	HINSTANCE blueSoleilDLL;
	
	/// \brief  Reţine handlere către diverse echipamente din raza comunicaţiei bluetooth
	BTDEVHDL	deviceID[ MAX_DEVICES ];

	/// \brief  Numele echipamentului cu care comunic i.e 'MyPDA'
	char deviceName[ NAME_LENGTH ];
	
	/// \brief  Numele portului serial i.e 'COM3'
	wchar_t portName[SERIAL_COM_NAME_LENGHT];

	/// \brief  Handler pentru conexiunea activă curentă
	BTCONNHDL					activeConnection;
	BtSdkConnectionPropertyStru	activeConnectionInfo;
	
	/// \brief  Bluetooth status
	DWORD			bluetoothMode;
	

// ======================================================================================
//									METODE INTERNE
// ======================================================================================
	///	\brief	Întoarce handlere către librăria bluesoleil pe baza numelor funcţiilor
	void	GetFunctionsFromDll();

	///	\brief Asociază evenimente i.e  <i> Un dispozitiv vrea să se conecteze </i> cu
	/// funcţiile de tratare a acestora
	void	RegisterEventHandlers();

	/// \brief Tratează găsirea unui echipament în raza BT
	static void	FoundDevice(BTDEVHDL);

	/// \brief	Lansează un eveniment de <i> Căutare Terminată </i>, necesar funcţiei de
	/// listare a echipamentelor
	static void	SearchComplete();

	/// \brief Lansată dacă un alt echipament doreşte să se conecteze sau să se deconecteze.
	static void ConnectionDog(BTCONNHDL connection, BTUINT16 connEvent, BTUINT8* arg);
	
public:
	/// \brief Urmăreşte activitatea liniei seriale
	Tserial_event		serialEye;
	// ===== Constructor
	BluesoleilInterface(void);
	~BluesoleilInterface(void);
	RESULT InitBluetooth();
	RESULT SearchDevices();
	RESULT Connect( UINT8 ) ;
	RESULT Disconnect( UINT8 );
	RESULT Send( BYTE*, UINT16 );
	RESULT Receive( char*, UINT16);
};
#endif